import os 
from binascii import b2a_hex, a2b_hex

class ABE:

    #Note：会生成对应文件，可以输出二进制内容
    #@Output(pub_key, master_key)
    def setup(self):
        os.system("./cpabe-setup")

        file = open('pub_key',"rb")
        pub_key = file.read()
        file.close()

        file = open('master_key',"rb")
        master_key = file.read()
        file.close()

        return pub_key,master_key
    
    #@Input(pub_key,master_key,user_attr)
    #@Output(user_priv_key)
    def keygen(self,pub_key_content,master_key_content,user_attr):
        file = open("pub_key","wb")
        file.write(pub_key_content)
        file.close()

        file = open("master_key","wb")
        file.write(master_key_content)
        file.close()

        os.system("./cpabe-keygen -o user_priv_key pub_key master_key " + user_attr)
        file = open('user_priv_key',"rb")
        user_priv_key = file.read()
        file.close()
        
        return user_priv_key


    #@Input(pub_key,msg,access_policy)
    #@Output(ciphertext)
    def encrypt(self,pub_key_content,msg,access_policy):
        file = open("pub_key","wb")
        file.write(pub_key_content)
        file.close()

        file = open("user_security_file","w")
        file.write(msg)
        file.close()

        os.system("./cpabe-enc pub_key user_security_file " + access_policy)

        file = open("user_security_file.cpabe","rb")
        ciphertext = file.read()
        file.close()

        return ciphertext

    #@Input(pub_key,user_priv_key,ciphertext)Sθ����x�w~��=�	w��\n�_�1[�FvwbQ`��X����!�'�,�  l#����+и\�Ժa&�^�V�=��qAW��F��'���yPb�
    #@Output(msg)
    def decrypt(self,pub_key_content,user_priv_key_content,ciphertext):
        file = open("pub_key","wb")
        file.write(pub_key_content)
        file.close()     
        
        file = open("user_priv_key","wb")
        file.write(user_priv_key_content)
        file.close()  

        file = open("user_security_file.cpabe","wb")
        file.write(ciphertext)
        file.close()

        os.system("./cpabe-dec pub_key user_priv_key user_security_file.cpabe")

        file = open("user_security_file")
        msg = file.read()
        file.close()  

        return msg


if __name__ == '__main__':

    abeObj = ABE()

    pub_key,master_key = abeObj.setup()
    print("公共秘钥 =>   ",pub_key)
    print("\n\n\n\n\n")
    print("主密钥 =>   ",master_key)
    print("\n\n\n\n\n")
    
    user_priv_key = abeObj.keygen(b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80\x10\xae\xf4<\x01\xd0j\xa2\xa5E\x88X\x13\x92\xe3}\xcfh4\x92\'W\xc96\x00\x00.`Z\x8d\x9e;N{D\x05\xf1\x96\xd8[\x8c\xa0\xbeJ\xee\x07\xdf\x1c\xe0\xa7\xe5\xd1\x01e\n\x95\xb0\xdfY+\x07c\xd1\xc2\x1f\xa2\x0f\x1c\xfbod"W%\x0b\xeb{>\x9b\xde\xe4\xb3\xff\x1d1V\x1c\x10\x03\xd6\xf9\xeb\xf4,\x07`\x11\xb4\xf8\xddLvI4\xb4\xbcl\xe0\x902\x16\x831\x99\xbc\xc5b\x02\x82\xb6r#\x08\x0b\xf3\xc2I?\x00\x00\x00\x804C4\xcc\xfa\xb68\xc8\x80\x98\\\x8f\xe74U2\xf4\x90SB\xac&N)\xc9\xa0lLa\xd2\x0eW\xb1\x01\xde\xbf\x91\xfe%\xb6\xa6\xd9@\xd1\x1eYv\xb0\xc1\xeb\xf4\xcc\xf1\xed\xcd7swF\xaf|\tU\xe0\x11\xe9\x86&U<<\x12mD\xcdsQ6 >>\xee\x99\xf8"\x07#\xe9\x0c\xcf\x1ec\xf0\xad%\xdaDl\xd5Is\xc2u\x18\xc4M\x80\x03g\xfb\xb87W\x85\xbb\xd2\xc2_4lC\xc1\x8b\x9a\x10\xe0\x01<\x00\x00\x00\x80hK\xb7\x9a=\xcf\xb2\x0f\x9b\r\x94\x139\xfbz\x8a)3\x02+\xdb\x197E\xcf\xac\xb2\x01y\x03`\x13v\xd4\xb0@G\xa2\xab\xf9=\x876\xf2~g/\xf1\x93\x1d\xbf\xaf\xa4\xd6\xa31`\xac\x8b\x10\xf4"c\x80zK\xca\x90Ln\x8aw\x03\x18\x1e\xdd\xf2\x88\xd0\x14\x9c\xc5;\x0f\x00\x7f\xd2>\xecge8\x18bb\xd7j\x85\x88\xf5*\xa84\x0f00$\x12\xb5\x86\xab\xed\x7f\xd1\xc0O\xd1\xa1\xae(\xab\x0489\x8b\x85\xb1\xc0\x00\x00\x00\x80Pi\x8d\x17\xd9\xf2\xfe}\xef\x1c\xe5\xdd\x8b\xf6\x19\xd8T\xa65\x90\xe6E\xfd\x82\xccd\xa5{\x85%Q\xcbP*z\x8d\x82\xdf\x1a\xf6\x1f\xb9s\xe8a\xb5+\xe0\xc6o\x98\xe8=\xa1\xb8\x87(P\xf7\x0b\xd5(\x93\x8b\x136w=6\xd3\xf3\xd1\xb3\xd8oF\x9c\x1c\x81\x97}\x8e\x8b\nr\xb8\xf9\xaf3\x06\x81\x12\x1d#\xea\xc6\x04YJ\x8f\x1cA\xc8\xec\x86\xeb\xaeKp\x9aS\xe2\x9f<3 _\x8f\x02b\x88\xee\xe5\xcf\xb3V\xb3=',b"\x00\x00\x00\x14.\x14\x93j#a\x01\xbcp!?\xb94\xe7#\xf0ql^\xe0\x00\x00\x00\x80G\x8cS\xce\xb8\xe0\x99\xcb\xeex\xc8w~\xbf\xd5=\x9d\tw\xf1\xee\\n\xe0_\xdf1[\xb8FvwbQ`\xcd\x1f\x05\xdfX\x83\x83\x06\xab\xb2!\x9d'\x90,\xc7  l#\x05\xf4\xc3\x1c\xed\xe7+\xd0\xb8\\\xc3\xd4\xbaa&\xb1^\xbfV\xde=\xaa\xbdqAW\x8c\x94F\xac\xb8'\xe4\x86\xc0\xc0yPb\xec\n\xc1k\xc0+K#2lT\x1d\x86Yv[\x10\xf6\x81\xce\xc7\x85\xa5\xaf\xeaa\xeb,\x97TT\x96\x1f4","sysadmin it_department")
    print("用户私钥 =>   ",user_priv_key)
    print("\n\n\n\n\n")

    ciphertext = abeObj.encrypt(b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80U\xce\xc8\x8f\x04\xa7\xbe\x84\x01\xcb\x8f\xd8/\xe0\x0b?N\xf3\x91R\xc5}\xa3\x15\xa0\xef\x01\x14\x91\xd7c\xf8\xbb?\x1d<_r\xdb\xd7"\xba\x9c\xaf\rD\x91\xacl+\x89\xcf\xa8\x98\x19j\xc4\xab\xf0V\x9e\xe3\x97\x9d\x9f\xf9\x1e\xde\x01X\xdcU\xf8\xa8a\xa1\x06*0b\xfb\t\xdd\xcb\xe3g\xb1\x86\x87\x90\xd5\x8f\x0bx\xb2N\xea6\xbf\xa2\xe7\xe6\xd7mJ\xafk\x05\xe0\xb5\xfal,f\xc7\x87\x93\xeb\xa7\xb3\xe4&\xa0\xfb`\xbe\x0fx\x00\x00\x00\x80\xa5\xce\x1b\xeeIJ\xef\xac\x08\x0c\x98;\x02\xf0\x06\x97\xdb\xa4\x83\xb0\x9a\xe1\xb8\x0c\xb5\xd1\xb2\xe3s\x8e\xb5TQ\xc2x\x19\xde\x95\x9a\x1f\x01\xf0xW\xa4)\x1a\x1du\xc0v3\xaf\x9a\x1f\xa5I\xbflQ\xc60}`r\xf7\x89KoQ\xb4\xc8P\xe2\x80L\xec\x87\x05\x95C\xe6\x1b<\xf3\xbd\x9bL\xf2\xd0\xdf\x16\xfa\xd1O"\xf7JM\xff\x10|\xb4\xf6Xs\xcb\xd0\xf0\x17\xc1\xcc"w\xf7P\xeckB\xb9hAjP\xa2\x02\xd8\xc9\x00\x00\x00\x80Zu\xe6[\xc03?T\x90\xcf\xb2\xc1\x01d\xb5\xcf\x8b\xcd\xc47V\x0b\x8e\xb4T\xbf\x99\t\xf4\xb5@[\x8f\x06D\xec\xc7\xb9\xec\xef\xbd\xc0yt\xdf6\xfb5Y\xedB\x98\x13\xb69R\xee5\xbb*\x0fg\r)A ]\x10\xcbK\xba>\x9e\x8f3\xbf\xa3\x8a\xfeE@\xc3\x00\xe6V\xf6.\x12\x01p;M\xaeEY@\xdc uR\x11_J%Tl\x93\x00\xb4\xac<\xfb\xa8z\xc8\xe0;V-\x14\x0e\xcc\xb1\xd8\xb8F\xe1\x8c\x00\x00\x00\x80a\x0e3\x91dYm\xb7\x7f\x91N\r\xceK\xce6P\xd6\xc8\x17r]i\x9e\xe7f\x04\xcaOM\xa9n$v\xc2\xa0\xfc\xb1\x8e\x7feE\xc7\xd8\xde\xc0\xd1G\xd4\xd0r\x0e\xa3o\x1e\xcc\xf0|\xb7\x9c\xed3\x04a\x03\x93j\xb4zP\x08{\x9a\xa7?0lLhRs\x12\xe8cu\xf8b_O\xb0w*\x86\x15\x1cJeTQ\x15\xe1>\x19qL\x85\x19\xae\xed+^/-\x1a!\x96M\xbcR(5gO\xb7*>T\xaf',"123456abcdef","sysadmin")
    print("加密后的密文 =>  ",ciphertext)
    print("\n\n\n\n\n")

    msg = abeObj.decrypt(b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80U\xce\xc8\x8f\x04\xa7\xbe\x84\x01\xcb\x8f\xd8/\xe0\x0b?N\xf3\x91R\xc5}\xa3\x15\xa0\xef\x01\x14\x91\xd7c\xf8\xbb?\x1d<_r\xdb\xd7"\xba\x9c\xaf\rD\x91\xacl+\x89\xcf\xa8\x98\x19j\xc4\xab\xf0V\x9e\xe3\x97\x9d\x9f\xf9\x1e\xde\x01X\xdcU\xf8\xa8a\xa1\x06*0b\xfb\t\xdd\xcb\xe3g\xb1\x86\x87\x90\xd5\x8f\x0bx\xb2N\xea6\xbf\xa2\xe7\xe6\xd7mJ\xafk\x05\xe0\xb5\xfal,f\xc7\x87\x93\xeb\xa7\xb3\xe4&\xa0\xfb`\xbe\x0fx\x00\x00\x00\x80\xa5\xce\x1b\xeeIJ\xef\xac\x08\x0c\x98;\x02\xf0\x06\x97\xdb\xa4\x83\xb0\x9a\xe1\xb8\x0c\xb5\xd1\xb2\xe3s\x8e\xb5TQ\xc2x\x19\xde\x95\x9a\x1f\x01\xf0xW\xa4)\x1a\x1du\xc0v3\xaf\x9a\x1f\xa5I\xbflQ\xc60}`r\xf7\x89KoQ\xb4\xc8P\xe2\x80L\xec\x87\x05\x95C\xe6\x1b<\xf3\xbd\x9bL\xf2\xd0\xdf\x16\xfa\xd1O"\xf7JM\xff\x10|\xb4\xf6Xs\xcb\xd0\xf0\x17\xc1\xcc"w\xf7P\xeckB\xb9hAjP\xa2\x02\xd8\xc9\x00\x00\x00\x80Zu\xe6[\xc03?T\x90\xcf\xb2\xc1\x01d\xb5\xcf\x8b\xcd\xc47V\x0b\x8e\xb4T\xbf\x99\t\xf4\xb5@[\x8f\x06D\xec\xc7\xb9\xec\xef\xbd\xc0yt\xdf6\xfb5Y\xedB\x98\x13\xb69R\xee5\xbb*\x0fg\r)A ]\x10\xcbK\xba>\x9e\x8f3\xbf\xa3\x8a\xfeE@\xc3\x00\xe6V\xf6.\x12\x01p;M\xaeEY@\xdc uR\x11_J%Tl\x93\x00\xb4\xac<\xfb\xa8z\xc8\xe0;V-\x14\x0e\xcc\xb1\xd8\xb8F\xe1\x8c\x00\x00\x00\x80a\x0e3\x91dYm\xb7\x7f\x91N\r\xceK\xce6P\xd6\xc8\x17r]i\x9e\xe7f\x04\xcaOM\xa9n$v\xc2\xa0\xfc\xb1\x8e\x7feE\xc7\xd8\xde\xc0\xd1G\xd4\xd0r\x0e\xa3o\x1e\xcc\xf0|\xb7\x9c\xed3\x04a\x03\x93j\xb4zP\x08{\x9a\xa7?0lLhRs\x12\xe8cu\xf8b_O\xb0w*\x86\x15\x1cJeTQ\x15\xe1>\x19qL\x85\x19\xae\xed+^/-\x1a!\x96M\xbcR(5gO\xb7*>T\xaf',
        b'\x00\x00\x00\x80_\xe3\xbd\x89\xe5>,EuC\x0b\x99\x89\xfd\x00\xc9\xdeKe\x86\xc00\xba\xdb\x19\xe9\x1a\xc0\xd7\xb3\xbe?2`Q\xcd\xda\xdar\xfd=9\x18\xffW"J;\xe0\xaa\xd69\xec\x97\x04K\xc5\xc1\xf4\x9a\x15\xd2\xb7\xd5,/\x05-O\x12`J\x85A}\xd9\xc4\xa1\xd5\xfe\xa7\xcd\xf8\xf6\x80N%U\xddz\xf5\x9e\x1d\x12\xad7\x91\xb77`DA\x07s_$H\x1e\x1cM\x15H\xc7\xd7^z\xffC\x0e\x8d\x14#c\xe3\xc7\xcfC\x9e\x00\x00\x00\x02it_department\x00\x00\x00\x00\x80?\x87*\xf4\xc4\xa0f\r\xbe\x14\x07K_\x89,>\xae\x8a\x85\xb1-e+\xb1\x9a8\xf3\n6\xe8\xc1sW\x95\xba\x1e\x9c[\xb7\x1e\x1d\xbdza;:\xc6_7*\xef\xce\xd8\x8e\xa1\x9cT](\xbfk\x1b\xf2\nj\x18q\xff\x82\xc8\xa3\xa8\xe2\xe1\xdb\xfd\xb6\xfb\xe6\xd2i\x10\xf7\x99\x03\x98\xa3"1\xeb\xfc\x1fB\x16\xed\xceT\x07A\xfb\xe4\xf05C6\x88\xce\xf2\xda9\xf5\xac\t0\xf4!\xd8F\xfb".\xb8\xc8\xf4\x80+\xdc\x05\x00\x00\x00\x80\x99\xe1O,i\xe5\xd6\x872\xe5\xf4\x13J\x12\x15\xde\xc6@\x05^\x8c\xdb\xe1\xaf\x11\xb8#e\xa6\xd2\x12v\xe7\x11\xcc\xa9\x88 (\rm\x85\xc55\xb7iD\xe0e\xab\x0e\xfe\x95w\xfbQ\xf9L\x04PRY}\xd4\x02\x99\xd0>\xfeY\x99\xc1\xff)\xfb\x04a\x7f\xda8S\xee\x03\x19\x0f\x81\xa5\xe9\xf24rl\x8f\xd8\xf7\xc1\x8edj\xa48\x0e\x9cp\xc8v7\xd6\xa6_\xe4\xbfg\xb6>+b\xfb\xb3\xe6\x85d\xb1\xb9\xea\xc7\xc6\x0esysadmin\x00\x00\x00\x00\x80~\xf1\x01\x12\xa6P\x93\x98\r\x84!\xf4\x1fW?1\xb8>\xff\xea\xb8\xb8\xc8\xcb\xac\x17\x1b\x9f\x9cm\x1a\xe7\xb73P\xdb\x85\xe5\xfc\x8a}b\xa0}\x8e\xe5\xfc\x11\x1a\xff\xb0M{\xde\x06w\xccH`\xb4\x8bS\xa81\x99u\xba>g\x93\x9a\x95x\x8a\x80F\nC+[1\x1d\xa7\x06\x96\xe2\xcb\x1a\x04w\xac\xa2o\xb8\x9f\x80\x9b\xd6B*\xcb\xc0\xd6\xde\xc3\t\xe9!7\xc8\xcf)/\xac\xf8\x95\x01\x88bN\x9f\x0c\r\x9d\xd8i\x96\xfd\x00\x00\x00\x80>\xfc@\x86\x89fA\xa4\xccC\xa4%\xa1\xe91\xb1\xa1!\xa0\xe1m5\xd3\x8ag\xae\x9a\xa4]3\\\xaa\x88\xd7y\xe8\xc1\xcd\xf8\xd7U\x8e\xcc\xf0\xeb\x10\xf7\x1dJ\xb5 T\x02\xe0\xb2=\x19Y\xcc\x1eh\xfe\x92#S\xa7!\xd7\xaeE\xf6?\xc7\x17\x91\xb2\x0f\x18\xfb\xe0\xe9\x16\xd8\xcf\x03\x9d\x1dn\x8a\xcb>\xe2\x7f\x01\x99\xd4$\xa42\x8c\xf8\xf9\x01\xbd\xc9$#\xa0\xce\xfa\x83\xc3\x9b);\xb5B\xb6\x8a\xd6P\x7f2\xaaUF#\x8b',
        b'\x00\x00\x00\x0c\x00\x00\x00\x10\x85\xe8L\xee\x0e\x8c\xaa=\\34\x1e\xb1\xae[\x97\x00\x00\x02!\x00\x00\x00\x80%\xeb\xc7o[\xfe"\xf7\x95\xb4\x94X5\x08?YXp\xd6\x90+7\xbdv\xd2ZUg\xc3\xba\xf7\xb3\xa3c *\xf4\x02\x8c\xe1\xaf\xcc\x8d \xf6\x18\xa7n6\xf1\x95\xd9\xec_@\xe0,P\xab\xa9[\xf4\xe8W\x93\\Np*\xaa\x1a\x85\x95um\xaa.\xbc\x99\x08\xc9\xd9=\xd3\xa6)\xdb\x01\x02\xd4<\x0f\x93OhA\x86T\xce\x0b\xe9k-\x80\xdc`\x0b\xd4\xe2\xbe\xb4\xab\xab\xe4r\xc2\xab\xec\xed$\x88"Dqb\xcf\xabA\x00\x00\x00\x80P\xdfMc@\xd0;m\xf3m\xd8^\xf3\xd3\x1b*\xe2N\x19\x86\x1d\xfd;\xea2\xc1\xd7\xbc\x93\xd0\xfap\x99\x89\x01\x0cYsA\xa2\x96\xb3\x14\x80\x1eJ\x83\xbf\xc6\xda\x95\xa2\xcbGc\xf6\x97w;\x1d\xacB\xab\xaea\xd8\xb1\xf9i\xa9D\x93\x01w\xc7\x83\xcc\xc7\xde\xe10\xd8R\x89a`\x1d\xbe\xe37M\xbb]\x19W\xc9\xb3\xca&3\xf7\xb3\xc0\x03nL\x0e\x1d\x95\x0c\xd5\x88\x82!\xbc\xaa\xe5]\xef"\x7f\x8a"\x14I\xd5>\x02\x00\x00\x00\x01\x00\x00\x00\x00sysadmin\x00\x00\x00\x00\x80\x1e\xbb\xac\xfd\xcf*\xc7\x0fQ\x1e\xa9\xd4M\x03\xf1vh\x81\xc7!(\x98\xaea\xf1d\x96\xb2\xee\x90\xf3\xee\x91\xb2\r\x97\r\x9d\xc7\xd1F\x9e\xd2\xbdX.e\xcc\xd9\x85X\xa7\x9c\xde\xea\x98\x1d\xfb\x8a\xbb!(Y\xf8|5\xef\xc5;\xdf9\xb5m\x14\xb1\x95\xdf\n\xb3\x00\xe6\xed\xd6\x155\xf1\x8e\x9c\xa6\xdb\x0f\x18q\x847$\x8f\'\x9f3~\x14P\xc2\xa7\xb2\x87S\xba\xf3^\xc3z\x9c3@g\xfa\x8b\xaa\x8f\xb5\x7f6D\x13\xaf\x1b\x00\x00\x00\x80\'7 \xc8\x1c\x8b\x9d\x8d\ru7\xe5U7n\xa81C\xf6\x8f\x8dl\xad\xcc\x8d\xa9I\x84\x99\xac\xcb\x1d!\xee\xed\xe3t\x07\n\x18\x8d\x1eKAtd\xe3\xa2#\x8e\xe4\x1f\x0c%\x99C\xe1!EC\xf9*\xb4\x8e0O\x95X}8}\\5\t\xdc\x9e\x8d\x89\xf7\xb3\x85\\]T\x8c\x9f\xd6\x89qS\xbb\xb1 \xd0-*\xf1uC\xa6\x18\x01F\xf0\xf6\xf8w\xbc\xe8\xda\xfe2\x07g\xf8&,\xbb\x08=\x82\xb6\xef;\x80\xda\x9f\xfa'    )
    print("解密后的明文 =>  ",msg)


